    /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trab01_so;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.border.LineBorder;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;

/**
 *
 * @author lena
 */
class AppView extends FrameView {

    GM gerenciador;
    BufferedReader reader;
    JPanel jpMp, jpMv, jpEntrada, painelInferior;

    public AppView(SingleFrameApplication app) throws FileNotFoundException {
        super(app);
        this.reader = new BufferedReader(new FileReader(new File("input.txt")));
        initComponents();
    }

    private void initComponents() {
        try {
            JFrame frame = new JFrame();

            GridLayout mgr = new GridLayout();

            mgr.setColumns(1);
            mgr.setRows(2);
            mgr.setHgap(10);
            mgr.setVgap(10);

            JPanel painelWrap = new JPanel(mgr);
            painelWrap.setVisible(true);
            painelWrap.setSize(1350, 700);
            painelWrap.setBackground(Color.white);

            mgr = new GridLayout();
            mgr.setColumns(5);
            mgr.setRows(1);
            mgr.setHgap(20);
            JPanel painelSuperior = new JPanel(mgr);
            painelSuperior.setSize(1350, 500);
            painelSuperior.setBackground(Color.WHITE);
            painelWrap.add(painelSuperior);

            mgr = new GridLayout();
            mgr.setColumns(2);
            mgr.setRows(8);
            mgr.setHgap(5);
            mgr.setVgap(5);
            JPanel painelSupEsq = new JPanel(mgr);
            painelSupEsq.setSize(500, 500);
            painelSupEsq.setBackground(Color.WHITE);
            painelSupEsq.setBorder(new LineBorder(Color.BLACK));
            painelSuperior.add(painelSupEsq);

            JLabel jlbl1 = new JLabel("Digite o tamanho das páginas e quadros em bytes");
            jlbl1.setVisible(true);
            painelSupEsq.add(jlbl1);
            final JTextField jtf1 = new JTextField("10");
            jtf1.setVisible(true);
            jtf1.setSize(100, 25);
            painelSupEsq.add(jtf1);

            JLabel jlbl2 = new JLabel("Digite o tamanho do endereço lógico em bits");
            jlbl2.setVisible(true);
            painelSupEsq.add(jlbl2);
            final JTextField jtf2 = new JTextField("16");
            jtf2.setVisible(true);
            jtf2.setSize(100, 25);
            painelSupEsq.add(jtf2);

            JLabel jlbl3 = new JLabel("Digite o tamanho da memória principal em bytes");
            jlbl3.setVisible(true);
            painelSupEsq.add(jlbl3);
            final JTextField jtf3 = new JTextField("40");
            jtf3.setVisible(true);
            jtf3.setSize(100, 25);
            painelSupEsq.add(jtf3);

            JLabel jlbl4 = new JLabel("Digite o tamanho tamanho máximo da memória secundária em bytes");
            jlbl4.setVisible(true);
            painelSupEsq.add(jlbl4);
            final JTextField jtf4 = new JTextField("60");
            jtf4.setVisible(true);
            jtf4.setSize(100, 25);
            painelSupEsq.add(jtf4);

            JLabel jlbl5 = new JLabel("Digite o tamanho da imagem de cada processo em bytes");
            jlbl5.setVisible(true);
            painelSupEsq.add(jlbl5);
            final JTextField jtf5 = new JTextField("10");
            jtf5.setVisible(true);
            jtf5.setSize(100, 25);
            painelSupEsq.add(jtf5);

            JLabel jlbl6 = new JLabel("Política de Substituição");
            jlbl6.setVisible(true);
            painelSupEsq.add(jlbl6);
            JPanel painelSubstituicao = new JPanel();
            final JRadioButton jrb3 = new JRadioButton();
            jrb3.setText("LRU");
            painelSubstituicao.add(jrb3);
            final JRadioButton jrb4 = new JRadioButton();
            jrb4.setText("FIFO");
            ButtonGroup bg2 = new ButtonGroup();
            bg2.add(jrb3);
            bg2.add(jrb4);
            painelSubstituicao.add(jrb3);
            painelSubstituicao.add(jrb4);
            painelSupEsq.add(painelSubstituicao);

            JLabel jlbl7 = new JLabel("Escopo de Substituição");
            jlbl7.setVisible(true);
            painelSupEsq.add(jlbl7);
            JPanel painelEscopo = new JPanel();
            final JRadioButton jrb1 = new JRadioButton();
            jrb1.setText("LOCAL");
            painelEscopo.add(jrb1);
            final JRadioButton jrb2 = new JRadioButton();
            jrb2.setText("GLOBAL");
            ButtonGroup bg = new ButtonGroup();
            bg.add(jrb1);
            bg.add(jrb2);
            painelEscopo.add(jrb1);
            painelEscopo.add(jrb2);
            painelSupEsq.add(painelEscopo);

            final JButton btnNext = new JButton("Executar Instrução");
            btnNext.setVisible(true);
            btnNext.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        boolean rodar = true;
                        String msgs = "";
                        if (reader.ready()) {
                            if (jrb2.isSelected()) {
                                gerenciador.escopo = "GLOBAL";
                            } else if (jrb1.isSelected()) {
                                gerenciador.escopo = "LOCAL";
                            } else {
                                msgs += "- Escolha um escopo de substituição!\n";
                                rodar = false;
                            }

                            if (jrb3.isSelected()) {
                                gerenciador.substituicao = "LRU";
                            } else if (jrb4.isSelected()) {
                                gerenciador.substituicao = "FIFO";
                            } else {
                                msgs += "- Escolha uma política de substituição!\n";
                                rodar = false;
                            }

                            if (jtf1.getText().equalsIgnoreCase("")) {
                                rodar = false;
                                msgs += "- Digite o tamanho de quadros e páginas!\n";
                            } else {
                                gerenciador.tamQuadros = Integer.parseInt(jtf1.getText());
                            }
                            if (jtf2.getText().equalsIgnoreCase("")) {
                                rodar = false;
                                msgs += "- Digite o tamanho do endereço lógico!\n";
                            } else {
                                gerenciador.tamEndereco = Integer.parseInt(jtf2.getText());
                            }
                            if (jtf3.getText().equalsIgnoreCase("")) {
                                rodar = false;
                                msgs += "- Digite o tamanho da memória principal em bytes!\n";
                            } else {
                                gerenciador.tamMemPrinc = Integer.parseInt(jtf3.getText());
                            }
                            if (jtf4.getText().equalsIgnoreCase("")) {
                                rodar = false;
                                msgs += "- Digite o tamanho máximo da memória secundária em bytes!\n";
                            } else {
                                gerenciador.tamMemSec = Integer.parseInt(jtf4.getText());
                            }
                            if (jtf5.getText().equalsIgnoreCase("")) {
                                rodar = false;
                                msgs += "- Digite o tamanho da imagem de cada processo em bytes!\n";
                            } else {
                                gerenciador.tamImagem = Integer.parseInt(jtf5.getText());
                            }

                            if (rodar) {
                                String instrucao = reader.readLine();
                                jpEntrada.add(new JLabel(instrucao));
                                gerenciador.recebeInstrucao(instrucao);
                                atualizaMemoriaPrincipal();
                                atualizaMemoriaSecundaria();
                                atualizaTabelaPaginas();
                            } else {
                                JOptionPane.showMessageDialog(null, msgs);
                            }
                        } else {
                            JOptionPane.showMessageDialog(null, "Fim da execução.");
                            btnNext.setEnabled(false);
                        }
                    } catch (IOException ex) {
                        Logger.getLogger(AppView.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });
            painelSupEsq.add(btnNext);

            final JButton restart = new JButton("Reiniciar");
            restart.setVisible(true);
            restart.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        reader.close();
                        reader = new BufferedReader(new FileReader(new File("input.txt")));
                        gerenciador.mp = new MemoriaPrincipal();
                        gerenciador.mv = new MemoriaVirtual();
                        gerenciador.tabelaPaginas = new ArrayList<ArrayList<Pagina>>();
                        gerenciador.substituicao = "";
                        gerenciador.escopo = "";
                        jpMv.removeAll();
                        jpMv.revalidate();
                        jpMv.validate();
                        jpMv.repaint();
                        jpMp.removeAll();
                        jpMp.revalidate();
                        jpMp.validate();
                        jpMp.repaint();
                        jpEntrada.removeAll();
                        jpEntrada.revalidate();
                        jpEntrada.validate();
                        jpEntrada.repaint();
                        painelInferior.removeAll();
                        painelInferior.revalidate();
                        painelInferior.validate();
                        painelInferior.repaint();
                        btnNext.setEnabled(true);
                    } catch (IOException ex) {
                        Logger.getLogger(AppView.class.getName()).log(Level.SEVERE, null, ex);
                    }

                }
            });
            painelSupEsq.add(restart);

            mgr = new GridLayout();
            mgr.setColumns(3);
            mgr.setRows(1);
            mgr.setHgap(20);
            JPanel painelSupDir = new JPanel(mgr);
            painelSupDir.setSize(850, 500);
            painelSupDir.setBackground(Color.WHITE);
            //painelSupDir.setBorder(new LineBorder(Color.BLACK));
            painelSuperior.add(painelSupDir);

            mgr = new GridLayout();
            mgr.setColumns(1);
            mgr.setRows(20);
            jpMp = new JPanel(mgr);
            jpMp.setBackground(Color.WHITE);
            jpMp.setBorder(new LineBorder(Color.BLACK));
            jpMp.setSize(50, 300);
            painelSupDir.add(jpMp);

            jpMv = new JPanel(mgr);
            painelSupDir.add(jpMv);
            jpMv.setBorder(new LineBorder(Color.BLACK));
            jpMv.setSize(50, 300);
            jpMv.setBackground(Color.WHITE);

            jpEntrada = new JPanel(mgr);
            jpEntrada.setBackground(Color.WHITE);
            jpEntrada.setBorder(new LineBorder(Color.BLACK));
            painelSupDir.add(jpEntrada);


            mgr = new GridLayout();
            mgr.setRows(1);
            mgr.setColumns(10);
            mgr.setHgap(20);
            painelInferior = new JPanel(mgr);
            painelInferior.setSize(1350, 200);
            painelInferior.setBackground(Color.white);
            painelInferior.setVisible(true);
            //painelInferior.setBorder(new LineBorder(Color.BLACK));
            painelWrap.add(painelInferior);

            frame.add(painelWrap);
            frame.setEnabled(true);
            frame.setSize(1350, 700);
            frame.setVisible(true);
            this.setFrame(frame);

            /*
             * JLabel jlbl = new JLabel("Memória Virtual");
             * painelEsquerda.setLocation(20,20);
             * painelEsquerda.setAlignmentX(0);
             *
             * frame.setEnabled(true); frame.setSize(1350, 700);
             * frame.setVisible(true); this.setFrame(frame);
             *
             */
        } catch (Exception exp) {
            JOptionPane.showMessageDialog(null, "Erro... " + exp);
        }
    }

    public void setGerenciador(GM g) {
        this.gerenciador = g;
    }

    public GM getGerenciador() {
        return this.gerenciador;
    }

    public void atualizaMemoriaPrincipal() {
        this.jpMp.removeAll();
        JLabel j = new JLabel("Memória Principal");
        j.setVisible(true);
        this.jpMp.add(j);
        JLabel j1 = new JLabel("--------------------------------------");
        j1.setVisible(true);
        this.jpMp.add(j1);

        for (int i = 0; i < this.gerenciador.mp.size(); i++) {
            JLabel aux = new JLabel("Processo " + gerenciador.mp.get(i).id + " #" + gerenciador.mp.get(i).getAddress());
            aux.setVisible(true);
            jpMp.add(aux);
        }
        jpMp.revalidate();
        jpMp.validate();
        jpMp.repaint();
    }

    public void atualizaMemoriaSecundaria() {
        GM gerenciador = this.getGerenciador();
        this.jpMv.removeAll();
        JLabel j = new JLabel("Memória Secundária");
        j.setVisible(true);
        this.jpMv.add(j);
        JLabel j1 = new JLabel("--------------------------------------");
        j1.setVisible(true);
        this.jpMv.add(j1);

        for (int i = 0; i < gerenciador.mv.size(); i++) {
            JLabel aux = new JLabel("Processo " + gerenciador.mv.get(i).id + " #" + gerenciador.mv.get(i).getAddress());
            aux.setVisible(true);
            jpMv.add(aux);
        }
        jpMv.revalidate();
        jpMp.validate();
        jpMp.repaint();
    }

    public void atualizaTabelaPaginas() {
        this.painelInferior.removeAll();
        for (int i = 0; i < gerenciador.tabelaPaginas.size(); i++) {
            GridLayout mgr = new GridLayout();
            mgr = new GridLayout();
            mgr.setRows(20);
            mgr.setColumns(1);
            JPanel aux = new JPanel(mgr);
            aux.setVisible(true);
            aux.setBorder(new LineBorder(Color.BLACK));

            for (int j = 0; j < gerenciador.tabelaPaginas.get(i).size(); j++) {
                if (gerenciador.tabelaPaginas.get(i).get(j).endereco.contains("@")) {
                    aux.add(new JLabel(gerenciador.tabelaPaginas.get(i).get(j).id + "|Virtual: #" + gerenciador.tabelaPaginas.get(i).get(j).address + "|Físico: #" + gerenciador.tabelaPaginas.get(i).get(j).endereco.split("@")[1]));
                }
            }

            this.painelInferior.add(aux);
            this.painelInferior.revalidate();
            this.painelInferior.validate();
            this.painelInferior.repaint();
        }
    }
}
